package com.kcwx.framework.config;

import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;

import java.util.Properties;

@Intercepts({
//        @Signature(
//                type = Executor.class,
//                method = "update",
//                args = {MappedStatement.class, Object.class}
//        ),
        @Signature(
                //拦截的类型 Executor：拦截执行器的方法。ParameterHandler：拦截参数的处理。ResultHandler：拦截结果集的处理。StatementHandler：拦截Sql语法构建的处理。
                type = Executor.class,
                method = "query",//方法 query、update、delete、insert
                args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}//指明参数类型，从而确定是哪一个方法
        )
})
/*
  mybatis全局过滤器
  */
public class GlobalFilterInterceptor implements Interceptor {
        @Override
        public Object intercept(Invocation invocation) throws Throwable {
                // 在这里编写你的拦截逻辑
                MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
                Object parameterObject = invocation.getArgs()[1];
                BoundSql boundSql = mappedStatement.getBoundSql(parameterObject);
                String oldSql = boundSql.getSql();
                // 比如，你可以在这里添加一些全局的SQL条件
                // 执行原来的方法
                return invocation.proceed();
        }

        @Override
        public Object plugin(Object target) {
                return Plugin.wrap(target, this);
        }

        @Override
        public void setProperties(Properties properties) {
                // 可以接收配置的属性
        }
}
